iT邦幫忙

2023 iThome 鐵人賽

DAY 29
1

Spring Security

Spring Security 是一個用於保護和管理 Java 應用程式安全性的框架。它提供了身份驗證、授權和其他安全功能,可用於防止未經授權的訪問、數據外洩和其他安全威脅。

Spring Security 的主要特點和概念包括:

  1. 身份驗證:Spring Security 提供了各種身份驗證機制,包括基於表單的身份驗證、HTTP 基本/摘要身份驗證、OAuth 等。
  2. 角色授權:它允許您根據使用者角色和權限控制應用程式不同部分的訪問權限。
  3. 使用者詳細資訊:Spring Security 支持存儲和檢索使用者詳細信息,如用戶名、密碼和角色。
  4. 會話管理:它提供了會話管理功能,例如控制每個使用者的活動會話數量、處理會話超時和自定義會話固定保護。
  5. CSRF 保護:Spring Security 透過在表單中包含令牌來防止跨站請求偽造(CSRF)攻擊,以驗證請求是否來自可信任來源。
  6. 自定義過濾器:我們可以創建自定義Filter以處理特定的安全問題。
  7. OAuth 2.0:Spring Security 支持 OAuth 2.0,這是一種用於保護 API 並允許第三方訪問資源的常用方法。

Spring Security 範例

以下是一個簡單的 Spring Security 示例,演示如何配置 Spring Boot 應用程序以進行基本的身份驗證和授權。

  1. 新增 Spring Security 依賴於專案內。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. 創建一個 Spring Security 設置類別SecurityConfig,除了定義一個基本的使用者帳戶,也設置了訪問控制規則,使用者必須在訪問某些頁面之前進行登錄,否則需要進行身份驗證。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 定義一個 UserDetailsService Bean,這個 Bean 負責提供使用者詳細信息,包括使用者名稱、密碼和角色。
    @Bean
    public UserDetailsService userDetailsService() {
        // 建立一個使用者帳戶,使用 withDefaultPasswordEncoder() 方法對密碼進行加密。
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();
        // 使用 InMemoryUserDetailsManager 來管理使用者詳細信息,這裡只有一個使用者。
        return new InMemoryUserDetailsManager(user);
    }

    // 設置 Spring Security 的訪問控制規則
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests() // 定義哪些路徑可以被公開訪問
                .antMatchers("/", "/home").permitAll() // 定義除了上面設置的路徑外,其他所有請求都需要驗證身份。
                .anyRequest().authenticated()
                .and()
            .formLogin() // 指定登錄頁面的路徑。
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}
  1. @Bean 用來定義一個 UserDetailsService Bean,這個 Bean 用於提供使用者詳細資訊。我們在這裡使用 InMemoryUserDetailsManager 來管理我們的使用者帳戶。
  2. configure(HttpSecurity http) 方法中,我們設置了訪問控制規則。使用 antMatchers() 定義哪些路徑可以被公開訪問,使用 anyRequest().authenticated() 規定所有其他請求都需要驗證身份。
  3. 使用 formLogin() 設置了表單登錄的相關配置,包括登錄頁面的路徑。
  4. 最後,我們使用 logout() 定義了登出操作的相關設定。

以上,我們就完成了一個簡單的 Spring Security 範例,它可以根據我的應用程式需求進行更複雜的設置和規劃。

參考資料

https://spring.io/projects/spring-security
https://www.baeldung.com/security-spring


上一篇
Day 28 : Spring Boot RESTful API
下一篇
Day 30 : Spring、Spring MVC、Spring Boot學習的回顧
系列文
Spring、Spirng MVC 及 Spring Boot 自主學習旅途!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言